前言

刷 LeetCode 的时候,发现 LinkedList 可以同时作为 栈 和 队列 使用。记录一下它们作为不同数据结构使用时的用法。

LinkedList 是双向链表,现在的 java 的队列和栈都是把它们封装在了LinkedList 里面。

队列

即 FIFO 模型,先进先出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.util.LinkedList;
import java.util.Queue;

public class LinkedListTest01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Queue<String> q1 = new LinkedList<>();
q1.offer("aa");
q1.offer("bb");
q1.offer("cc");
while (q1.peek() != null) {
System.out.println(q1.poll());
// aa
// bb
// cc
}
}
}

接口方法

    • offer() 会在长度不够时返回 false
    • add() 会在长度不够时抛出异常:IllegalStateException;
    • poll() 会在没元素时返回 null
    • remove() 会在没元素时抛出异常:NoSuchElementException;
  • 查看队首元素

    • peek() 会在没元素时返回 null
    • element() 会在没元素时抛出异常:NoSuchElementException;
  • 是否为空

    • isEmpty() 空返回 true,否则返回 false

即 FILO 模型,先进后出

这里不是 Stack 借口了,Java 把栈封装在 Deque 接口里面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.Deque;
import java.util.LinkedList;

public class LinkedListTest01 {
public static void main(String[] args) {
Deque<String> s1 = new LinkedList<>();
s1.push("aa");
s1.push("bb");
s1.push("cc");
while (s1.peek() != null) {
System.out.println(s1.poll());
// cc
// bb
// aa
}
}
}

接口方法

img

扩展:Deque 接口

Deque 是双向队列,此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(nullfalse,具体取决于操作)。

里面的方法可以看这篇文章:Java 数据结构之Deque(双向队列)

参考文章

java linkedlist里面的队列和栈

(集合五)Set接口、Queue接口、Deque接口、Stack栈结构示例

Java 数据结构之Deque(双向队列)